#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hashtable.h"
#include "io.h"


/*
 * Procedura per la scrittura della hashtable nel file, elemento per elemento,
 * separando i vari campi con ":"
 *
 * @param Vettore di caratteri contenente il path del file in cui scrivere
 * @param Vettore di tipo hastable da cui leggere i dati
 */
void scriviFile(hashcell *Table[], char file_path[]) {

	//Dichiaro alcune variabili utili per ricavare i dati
	int i;
	hashcell *elemento;

	//Apre il file in scrittura
	FILE * fp = fopen (file_path, "w");

	//Controlla se il file è stato aperto con successo
	if (fp == NULL) {
		fprintf(stderr, "Errore durante l'apertura del file %s\n", file_path);
	} else {

		//Leggo ogni lista della hashtable
		for(i = 0; i < HL; i++) {

			//Controllo se nella posizione i sia presente una lista di utenti
			elemento = Table[i];
			while (elemento != NULL) {

				//Scrivo le info dell'utente appena ricavate nel file
				fprintf(fp, "%s:%s:%s\n", elemento -> username, elemento -> name, elemento -> email);

				//Assegno a temp l'indirizzo della cella successiva
				elemento = elemento -> next;
			}
		}

		//Chiudo il file
		fclose(fp);
	}
}


/*
 * Funzione per la lettura del file degli utenti, riga per riga, copiando i valori
 * di volta in volta nella hashtable
 *
 * @param Riferimento alla hashtable
 * @param Vettore di caratteri contenente il path del file da cui leggere
 */
void leggiFile(hashcell *Table[], char file_path[]) {

	//Dichiaro una variabile temporanea per la lettura delle linee
	char username[MAX_CHAR], name[MAX_CHAR], email[MAX_CHAR], line[MAX_CHAR * 3 + 3];

	//Apre il file in lettura (l'apertura in append serve a crearlo se non esiste)
	FILE *fp = fopen (file_path, "a");
	fclose(fp);
	fp = fopen (file_path, "r");

	//Controlla se il file è stato aperto con successo
	if (fp == NULL) {
		fclose(fp);
	} else {

		//Scansiono l'intero file leggendo riga per riga, finchè non è vuoto
		while (fscanf(fp, " %[^\n]", line) != EOF) {

			//Immetto i dati ricavati nella hashtable
			strcpy(username, strtok(line, ":"));
			strcpy(name, strtok(NULL, ":"));
			strcpy(email, strtok(NULL, "\0"));
			inserisciHashtable(Table, username, name, email, -1);
		}

		//Chiudo il file
		fclose(fp);
	}
}
